package com.sh.algorithm.easy;

/**
 * @author veviz
 * @description
 * 给定一个二叉树，它的每个结点都存放着一个整数值。
 *
 * 找出路径和等于给定数值的路径总数。
 *
 * 路径不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。
 *
 * 二叉树不超过1000个节点，且节点数值范围是 [-1000000,1000000] 的整数。
 *
 * 示例：
 *
 * root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8
 *
 *       10
 *      /  \
 *     5   -3
 *    / \    \
 *   3   2   11
 *  / \   \
 * 3  -2   1
 *
 * 返回 3。和等于 8 的路径有:
 *
 * 1.  5 -> 3
 * 2.  5 -> 2 -> 1
 * 3.  -3 -> 11
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/path-sum-iii
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @create 2020-03-02 21:26
 */
public class Solution437 {
    public int pathSum(TreeNode root, int sum) {
        return sumPath(root,0,new int [1000],sum);
    }

    public int sumPath(TreeNode root, int p, int [] array,int sum){
        if (root == null){
            return 0;
        }
        int n = root.val == sum ? 1 : 0;
        int temp = root.val;
        for (int i=p-1;i>=0;i--){
            temp += array[i];
            if (temp == sum){
                n++;
            }
        }
        array[p] = root.val;
        int n1 = sumPath(root.left,p+1,array,sum);
        int n2 = sumPath(root.right,p+1,array,sum);
        return n + n1 + n2;
    }
}
